package com.jianli.smart.aop;

import java.lang.reflect.Method;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public abstract class AspectProxy implements Proxy{
	
	private static final Logger logger = LoggerFactory.getLogger(AspectProxy.class);

	@Override
	public Object doProxy(ProxyChain proxyChain) throws Throwable {
		Object result = null;
		
		Class<?> cls = proxyChain.getTargetClass();
		Method method = proxyChain.getTargetMethod();
		Object[] params = proxyChain.getMethodParams();
		
		begin();
		
		try{
			before(cls, method, params);
			result = proxyChain.doProxyChain();
			after(cls, method, params);
		}catch(Exception e){
			logger.error("proxy failure",e);
			error(cls, method, params, e);
			throw e;
		}finally{
			end();
		}
		return result;
	}
	
	public void begin(){
		
	};
	
	public void before(Class<?> cls, Method method, Object[] params) throws Throwable{
		
	}
	
	public void after(Class<?> cls, Method method, Object[] params) throws Throwable{
		
	}
	
	public void error(Class<?> cls, Method method, Object[] params, Throwable e){
		
	}
	
	public void end(){
		
	}
}
